package ProxyPattern.dynamicProxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class LogHandler implements InvocationHandler {

    // 目标对象， 被代理的对象
    private Object targetObject;

    public Object newProxyInstance(Object targetObject)
    {
        this.targetObject = targetObject;

        // 三个参数的含义
        // 被代理对象的 类加载器
        // 被代理对象的 所有接口信息
        // 被代理对象的方法在调用 时会被拦截， 拦截时执行 InvocationHandler 的 invoke 方法

        // 返回 一个 代理对象
        // 我猜： 此代理对象 会按照 被代理对象的 接口信息 封装接口，接口 内部 首先整理参数 数组，
                // 然后找到  被代理对象 对应的 method对象， 然后 调用 InvocationHandler 的 invoke方法
        // 最终做事的 是在 invoke 方法中 做的
        return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
                targetObject.getClass().getInterfaces(), this);
    }


    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        for (int i = 0; i < args.length; i++) {
            System.out.println(args[i]);
        }

        Object ret = null;
        try{
            System.out.println("start -->>");

            ret = method.invoke(targetObject, args);

            System.out.println("success -->>");
        }catch (Exception e){
            e.printStackTrace();
            System.out.println("error -->>");
            throw e;
        }
        return ret;
    }
}
